#include <iostream>
#include <vector>
using namespace std;

int main()
{
  int n; // 矩阵个数
  while (cin >> n)
  {
    // n个矩阵，每个矩阵的行列用一个二位数组装
    vector<vector<int>> matrix(n, vector<int>(2));
    // 输入每个矩阵的行和列
    for (int i = 0; i < n; i++)
    {
      cin >> matrix[i][0] >> matrix[i][1];
    }

    // 输入字符串,看是哪一种法则
    string cal;
    cin >> cal;

    vector<int> vec;
    // k统计')' p统计'(' q为中间字母的数量
    int p = 0, q = 0, ans = 0, k = 0;

    // 开始计算，首先要统计cal的情况
    for (int i = 0; i < cal.size(); i++)
    {
      if (cal[i] == ')')
      {
        k++;
        if (k > p)
        {
          break; // 跳出for循环,直接输出结果了
        }
        int x = vec.back(); // (AB)括号内倒数第一个矩阵B的索引
        vec.pop_back();

        int y = vec.back(); // (AB)括号内倒数第二个矩阵A的索引
        vec.pop_back();

        ans += matrix[y][0] * matrix[y][1] * matrix[x][0];
        vec.push_back(x);
      }
      else
      {
        // 左括号'('
        if (cal[i] == '(')
        {
          p++;
        }
        else
        {
          // 中间的字母的数量
          q++;
          vec.push_back(q);
        }
      }
    }
    cout << ans << endl;
  }
  return 0;
}

// 解法2
/*
主要思路：
1. 遇到"(“不处理；
2. 遇到字母将其对应的行列入栈
3. 遇到”)“弹栈，由于本题样例中只有(AB)这种情况，没有(ABC)这种情况，因此在遇到”)"后
只用弹栈两次
然后计算对应的两个矩阵相乘所需要的乘法次数
并将相乘之后得到的矩阵的行、列
信息压到栈中
*/

// [参考](https://blog.csdn.net/lmj_2529980619/article/details/104744872)
#include <iostream>
#include <string>
#include <stack>

using namespace std;

int main()
{
  int n; // 矩阵个数
  while (cin >> n)
  {
    int a[n][2]; //存行列

    for (int i = 0; i < n; i++)
    {
      cin >> a[i][0] >> a[i][1];
    }

    string str;
    cin >> str;
    int res = 0;
    int num1 = 0, num2 = 0;
    stack<int> row;
    stack<int> col;

    for (int i = 0; i < str.size(); i++)
    {
      if (str[i] == '(')
      {
        num1++;
        continue;
      }
      else if (str[i] == ')')
      {
        num2++;
        if (num2 <= num1)
        {
          // 见到右括号，开始出栈
          int r1 = row.top();
          row.pop();
          int c1 = col.top();
          col.pop();

          int r2 = row.top();
          row.pop();
          int c2 = col.top();
          col.pop();

          res += r2 * r1 * c1;

          // (AB)之后的行列入栈
          row.push(r2); // A的行
          col.push(c1); // B的列
        }
      }
      else
      {
        // 如果是字母A那么就是第一个矩阵的行列
        row.push(a[str[i] - 'A'][0]);
        col.push(a[str[i] - 'A'][1]);
        //cout<<a[str[i]-'A'][0]<<" "<<a[str[i]-'A'][1]<<endl;
      }
    }

    cout << res << endl;
  }
  return 0;
}